#pragma once
#include<iostream>
#include<assert.h>
using namespace std;

class Date
{
public:
	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
	int GetMonthDay(int year, int month)
	{
		assert(year > 0 && month > 0 && month < 13);
		int arr[13] = { 0, 31,28,31,30,31,30,31,31,30,31,30,31 };
		if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
			return 29;
		return arr[month];
	}
	Date(int year = 1900, int month = 1, int day = 1)
		:_year(year)
		,_month(month)
		,_day(day)
	{
		cout << "Date(int year = 1900, int month = 1, int day = 1)" << endl;
	}
	Date(const Date& d)
	{
		if (this != &d)
		{
			_year = d._year;
			_month = d._month;
			_day = d._day;
		}
	}
	~Date()
	{
		cout << "~Date()" << endl;
	}
	Date& operator=(const Date& d)
	{
		if (this != &d)
		{
			_year = d._year;
			_month = d._month;
			_day = d._day;
		}
		return *this;
	}
	Date& operator+=(int day)
	{
		_day += day;
		int TheMonthDay = GetMonthDay(_year, _month);
		while (_day > TheMonthDay)
		{
			_day -= TheMonthDay;
			++_month;
			if (_month == 13)
			{
				++_year;
				_month = 1;
			}
			TheMonthDay = GetMonthDay(_year, _month);
		}
		return *this;
	}
	Date operator+(int day)
	{
		Date tmp(*this);
		tmp += day;
		return tmp;
	}
	Date operator-(int day)
	{
		Date tmp(*this);
		tmp -= day;
		return tmp;
	}
	Date& operator-=(int day)
	{
		_day -= day;
		while (_day <= 0)
		{
			--_month;
			if (_month == 0)
			{
				--_year;
				_month = 12;
			}
			_day += GetMonthDay(_year, _month);
		}
		return *this;
	}
	Date& operator++()
	{
		*this += 1;
		return *this;
	}
	Date operator++(int)
	{
		Date tmp(*this);
		*this += 1;
		return tmp;
	}
	Date operator--(int)
	{
		Date tmp(*this);
		*this -= 1;
		return tmp;
	}
	Date& operator--()
	{
		*this -= 1;
		return *this;
	}
	bool operator>(const Date& d)
	{
		if (_year > d._year)
			return true;
		else if (_year == d._year && _month > d._month)
			return true;
		else if (_year == d._year && _month == d._month && _day > d._day)
			return true;
		return false;
	}
	bool operator==(const Date& d)
	{
		return _year == d._year
			&& _month == d._month
			&& _day == d._day;
	}
	bool operator >= (const Date& d)
	{
		return (*this > d) || (*this == d);
	}
	bool operator < (const Date& d)
	{
		return !(*this >= d);
	}
	bool operator <= (const Date& d)
	{
		return !(*this > d);
	}
	bool operator != (const Date& d)
	{
		return !(*this == d);
	}
	int operator-(const Date& d)
	{
		int i = 0;
		Date max;
		Date min;
		if (*this >= d)
		{
			max = *this;
			min = d;
		}
		else
		{
			max = d;
			min = *this;
		}
		while (max != min)
		{
			++i;
			++min;
		}
		return i;
	}
private:
	int _year;
	int _month;
	int _day;
};





